package com.hon.legionnaire.negocio.dao;

import java.util.Collections;
import java.util.Date;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.hon.legionnaire.negocio.vo.CompraVO;
import com.hon.legionnaire.negocio.vo.ContaReceberVO;
import com.hon.legionnaire.negocio.vo.ProdutoVendaVO;
import com.hon.legionnaire.negocio.vo.ServicoVendaVO;
import com.hon.legionnaire.negocio.vo.VendaVO;

@Service("vendaDAO")
public class VendaDAO {

	@PersistenceContext
	private EntityManager entityManager;

	@Transactional(propagation = Propagation.REQUIRED)
	public void inserirVenda(VendaVO vendaVO) {
		try {
			entityManager.persist(vendaVO);
			
			for ( ProdutoVendaVO produtoVenda :  vendaVO.getListaProdutoVendaVO() ){
				produtoVenda.setVendaVO(vendaVO);
				produtoVenda.getProdutoVendaPK().setCodVenda(vendaVO.getCodigo());
				produtoVenda.getProdutoVendaPK().setCodProduto(produtoVenda.getProdutoVO().getCodigo());
				entityManager.persist(produtoVenda);
			}
			
			if (vendaVO.getListaServicoVendaVO() != null){
				for ( ServicoVendaVO servicoVenda :  vendaVO.getListaServicoVendaVO() ){
					servicoVenda.setVendaVO(vendaVO);
					servicoVenda.getServicoVendaPK().setCodVenda(vendaVO.getCodigo());
					servicoVenda.getServicoVendaPK().setCodServico(servicoVenda.getServicoVO().getCodigo());
					entityManager.persist(servicoVenda);
				}
			}
		} catch (Exception e) {
			throw new RuntimeException("Erro ao inserir venda: " + e.getMessage(), e);
		}
	}
	
	@Transactional(propagation = Propagation.REQUIRED)
	public void atualizarVenda(VendaVO vendaVO) {
		try {
			entityManager.merge(vendaVO);
		} catch (Exception e) {
			throw new RuntimeException("Erro ao atualizar venda: " + e.getMessage(), e);
		}
	}

	@Transactional(propagation = Propagation.REQUIRED)
	public void removerVenda(VendaVO vendaVO) {
		try {
			if (!entityManager.contains(vendaVO)) {
				vendaVO = entityManager.merge(vendaVO);
			}
			entityManager.remove(vendaVO);
		} catch (Exception e) {
			throw new RuntimeException("Erro ao remover venda: " + e.getMessage(), e);
		}
	}

	@SuppressWarnings("unchecked")
	@Transactional(propagation = Propagation.REQUIRED)
	public VendaVO obterVenda(VendaVO vendaVO) {
		try {
			VendaVO vendaAux = new VendaVO();
			vendaAux = entityManager.find(VendaVO.class, vendaVO.getCodigo());
			
			Query query = entityManager.createNamedQuery("loadAllProdutoVenda");
			query.setParameter("codigo", vendaAux.getCodigo());
			
//			List<ProdutoVendaVO> lista = (List<ProdutoVendaVO>) entityManager.createNamedQuery("loadAllProdutoVenda").getResultList();
			List<ProdutoVendaVO> lista = (List<ProdutoVendaVO>) query.getResultList();
			if ((lista != null) && (!lista.isEmpty())) {
				vendaAux.setListaProdutoVendaVO(lista);
			} else {
				vendaAux.setListaProdutoVendaVO(Collections.EMPTY_LIST);
			}
			return vendaAux;
			
		} catch (Exception e) {
			throw new RuntimeException("Erro ao buscar venda: " + e.getMessage(), e);
		}
	}

	@SuppressWarnings("unchecked")
	@Transactional(propagation = Propagation.REQUIRED)
	public List<VendaVO> obterListaVenda() {
		try {
			List<VendaVO> lista = (List<VendaVO>) entityManager.createNamedQuery("loadAllVenda").getResultList();
			if ((lista != null) && (!lista.isEmpty())) {
				return lista;
			} else {
				return Collections.EMPTY_LIST;
			}
		} catch (Exception e) {
			throw new RuntimeException("Erro ao carregar todos os vendas.", e);
		}
	}
	
	
	public void setEntityManager(EntityManager entityManager) {
		this.entityManager = entityManager;
	}
	
	@SuppressWarnings("unchecked")
	@Transactional(propagation = Propagation.REQUIRED)
	public boolean validaDuplicado(VendaVO vendaVO) {
		Query query = entityManager.createNamedQuery("findDuplicatedVenda");
		query.setParameter("codigo", vendaVO.getCodigo());
		query.setParameter("nota", vendaVO.getNota());
		query.setParameter("notaSerie", vendaVO.getNotaSerie());
		List lista = query.getResultList();
		if (lista.isEmpty()) {
			return true;
		} else {
			return false;
		}
	}
	
	@SuppressWarnings("unchecked")
	@Transactional(propagation = Propagation.REQUIRED)
	public boolean validaDuplicado(String nota, String notaSerie) {
		Query query = entityManager.createNamedQuery("findDuplicatedVendaOrdem");
		query.setParameter("nota", nota);
		query.setParameter("notaSerie", notaSerie);
		List lista = query.getResultList();
		if (lista.isEmpty()) {
			return true;
		} else {
			return false;
		}
	}

}